در لینوکس، کتابخانه (Library) مجموعهای از توابع (Functions) است که برنامهها میتوانند از آنها استفاده کنند. توابع، قطعههای کد مستقلی هستند که کارهای خاصی را انجام میدهند، مانند باز کردن یک فایل، خواندن داده، یا محاسبه یک مقدار.
به جای اینکه هر برنامه این توابع را داخل خودش داشته باشد، همه برنامهها از یک کتابخانه مشترک استفاده میکنند. این کار باعث صرفهجویی در فضا و سهولت بهروزرسانی میشود.
.a (Archive).so (Shared Object)
در ویندوز، کتابخانههای پویا با پسوند .dll (Dynamic Linked Library) شناخته میشوند که معادل .so در لینوکس هستند.
سیستم برای پیدا کردن کتابخانهها از ترتیب زیر پیروی میکند:
LD_LIBRARY_PATH (اولویت اول)PATH برنامه/etc/ld.so.conf.d/ (فایلهای کانفیگ)/etc/ld.so.conf (کانفیگ اصلی)/lib*/ و /usr/lib*/ (پیشفرض)برای مشاهده مسیرهای جستجوی کتابخانه، از دستور زیر استفاده کنید:
توضیح: دستور ldconfig -v مسیرهای جستجوی کتابخانه را به همراه نسخههای موجود نمایش میدهد.
ldd مخفف List Dynamic Dependencies است و کتابخانههای پویا (Shared Libraries) که یک برنامه به آنها نیاز دارد را نمایش میدهد.
توضیح: program نام برنامهای است که میخواهیم وابستگیهای کتابخانهای آن را بررسی کنیم.
ابتدا مسیر دقیق ls را با whereis پیدا میکنیم:
توضیح: whereis مسیر فایل اجرایی، صفحات راهنما و سورس فایل را پیدا میکند. در اینجا /usr/bin/ls مسیر فایل باینری است.
سپس با ldd وابستگیهای آن را بررسی میکنیم:
توضیح خروجی:
linux-vdso.so.1 → کتابخانه مجازی (Virtual Dynamic Shared Object) که توسط هسته در اختیار برنامه قرار میگیرد.libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 → کتابخانه libselinux که برای مدیریت سیاستهای SELinux استفاده میشود.libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 → کتابخانه اصلی C که اکثر برنامهها به آن نیاز دارند.libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 → کتابخانه برای پردازش عبارات با قاعده (Regular Expressions)./lib64/ld-linux-x86-64.so.2 → بارگذار پویا (Dynamic Linker) که کتابخانهها را در زمان اجرا بارگذاری میکند.
توضیح: htop به کتابخانههای libncursesw (برای رابط کاربری متنی) و libtinfo وابسته است.
| گزینه | توضیح | مثال |
|---|---|---|
-v یا --verbose |
نمایش اطلاعات کامل و جزئیات بیشتر (شامل نسخه کتابخانهها) | ldd -v /bin/ls |
-u یا --unused |
نمایش کتابخانههای غیرضروری که بارگذاری میشوند اما استفاده نمیشوند | ldd -u /bin/ls |
-r یا --function-relocs |
نمایش اطلاعات مربوط به توابع و آدرسهای بازنشانی (Relocation) | ldd -r /bin/ls |
توضیح: گزینه -v علاوه بر کتابخانهها، اطلاعات نسخه (Version Information) را نیز نمایش میدهد که مشخص میکند برنامه از کدام نسخه کتابخانهها استفاده میکند.
chroot (مخفف Change Root) یک تکنیک امنیتی است که ریشه (Root) سیستم را به یک دایرکتوری خاص تغییر میدهد. این کار باعث میشود که برنامه فقط به فایلهای داخل آن دایرکتوری دسترسی داشته باشد. برای اینکه برنامهها در محیط chroot به درستی کار کنند، باید کتابخانههای مورد نیاز آنها نیز در آن دایرکتوری وجود داشته باشند.
برای محدود کردن یک کاربر به دایرکتوری خانه خود، میتوان از chroot در /etc/ssh/sshd_config استفاده کرد:
توضیح: کاربر username فقط به دایرکتوری /home/username دسترسی خواهد داشت و نمیتواند به فایلهای سیستمی دسترسی پیدا کند.
برای اینکه دستورات در محیط chroot کار کنند، باید کتابخانههای آنها را با ldd شناسایی و به دایرکتوری chroot کپی کنید.
فرض کنید میخواهید یک محیط chroot ساده برای کاربر ایجاد کنید که بتواند از دستور ls استفاده کند.
توضیح گامبهگام:
mkdir -p /jail/bin → ایجاد دایرکتوری bin در زندان.mkdir -p /jail/lib64 → ایجاد دایرکتوری lib64 برای کتابخانههای ۶۴ بیتی.cp /bin/ls /jail/bin/ → کپی کردن دستور ls به زندان.ldd /bin/ls → شناسایی کتابخانههای مورد نیاز ls.cp /lib64/{...} /jail/lib64/ → کپی کردن کتابخانههای شناسایی شده به زندان.
حالا اگر با دستور chroot /jail /bin/ls وارد زندان شوید، میتوانید از ls استفاده کنید.
.a) و Shared/Dynamic (.so).ldd: وابستگیهای کتابخانهای یک برنامه را نمایش میدهد./lib، /usr/lib و /etc/ld.so.conf.ldd شناسایی و کپی کنید.ldd: -v (جزئیات)، -u (کتابخانههای غیرضروری)، -r (اطلاعات توابع).ldd وابستگیهای کتابخانهای برنامههای bash و python3 را بررسی کنید و کتابخانههای مورد نیاز را لیست کنید.ldconfig -v مسیرهای جستجوی کتابخانه را در سیستم خود ببینید.ldd -u /bin/ls کتابخانههای غیرضروری را شناسایی کنید (اگر وجود داشته باشند).ls و date را به آن اضافه کنید.chroot و کاربردهای آن در امنیت سرور مطالعه کنید.